home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_guile.idb / usr / freeware / info / guile.info-2.z / guile.info-2
Text File  |  2002-07-08  |  49KB  |  1,204 lines

  1. This is guile.info, produced by makeinfo version 4.0 from guile.texi.
  2.  
  3. INFO-DIR-SECTION The Algorithmic Language Scheme
  4. START-INFO-DIR-ENTRY
  5. * Guile Reference: (guile).     The Guile reference manual.
  6. END-INFO-DIR-ENTRY
  7.  
  8.    Guile Reference Manual Copyright (C) 1996 Free Software Foundation
  9. Copyright (C) 1997 Free Software Foundation
  10. Copyright (C) 2000 Free Software Foundation
  11. Copyright (C) 2001 Free Software Foundation
  12.  
  13.    Permission is granted to make and distribute verbatim copies of this
  14. manual provided the copyright notice and this permission notice are
  15. preserved on all copies.
  16.  
  17.    Permission is granted to copy and distribute modified versions of
  18. this manual under the conditions for verbatim copying, provided that
  19. the entire resulting derived work is distributed under the terms of a
  20. permission notice identical to this one.
  21.  
  22.    Permission is granted to copy and distribute translations of this
  23. manual into another language, under the above conditions for modified
  24. versions, except that this permission notice may be stated in a
  25. translation approved by the Free Software Foundation.
  26.  
  27. 
  28. File: guile.info,  Node: About Data,  Next: About Procedures,  Up: Basic Ideas
  29.  
  30. Data Types, Values and Variables
  31. ================================
  32.  
  33.    This section discusses the representation of data types and values,
  34. what it means for Scheme to be a "latently typed" language, and the role
  35. of variables.  We conclude by introducing the Scheme syntaxes for
  36. defining a new variable, and for changing the value of an existing
  37. variable.
  38.  
  39. * Menu:
  40.  
  41. * Latent Typing::               Scheme as a "latently typed" language.
  42. * Values and Variables::        About data types, values and variables.
  43. * Definition::                  Defining variables and setting their values.
  44.  
  45. 
  46. File: guile.info,  Node: Latent Typing,  Next: Values and Variables,  Up: About Data
  47.  
  48. Latent Typing
  49. -------------
  50.  
  51.    The term "latent typing" is used to describe a computer language,
  52. such as Scheme, for which you cannot, _in general_, simply look at a
  53. program's source code and determine what type of data will be
  54. associated with a particular variable, or with the result of a
  55. particular expression.
  56.  
  57.    Sometimes, of course, you _can_ tell from the code what the type of
  58. an expression will be.  If you have a line in your program that sets the
  59. variable `x' to the numeric value 1, you can be certain that,
  60. immediately after that line has executed (and in the absence of multiple
  61. threads), `x' has the numeric value 1.  Or if you write a procedure
  62. that is designed to concatenate two strings, it is likely that the rest
  63. of your application will always invoke this procedure with two string
  64. parameters, and quite probable that the procedure would go wrong in some
  65. way if it was ever invoked with parameters that were not both strings.
  66.  
  67.    Nevertheless, the point is that there is nothing in Scheme which
  68. requires the procedure parameters always to be strings, or `x' always
  69. to hold a numeric value, and there is no way of declaring in your
  70. program that such constraints should always be obeyed.  In the same
  71. vein, there is no way to declare the expected type of a procedure's
  72. return value.
  73.  
  74.    Instead, the types of variables and expressions are only known - in
  75. general - at run time.  If you _need_ to check at some point that a
  76. value has the expected type, Scheme provides run time procedures that
  77. you can invoke to do so.  But equally, it can be perfectly valid for two
  78. separate invocations of the same procedure to specify arguments with
  79. different types, and to return values with different types.
  80.  
  81.    The next subsection explains what this means in practice, for the
  82. ways that Scheme programs use data types, values and variables.
  83.  
  84. 
  85. File: guile.info,  Node: Values and Variables,  Next: Definition,  Prev: Latent Typing,  Up: About Data
  86.  
  87. Values and Variables
  88. --------------------
  89.  
  90.    Scheme provides many data types that you can use to represent your
  91. data.  Primitive types include characters, strings, numbers and
  92. procedures.  Compound types, which allow a group of primitive and
  93. compound values to be stored together, include lists, pairs, vectors
  94. and multi-dimensional arrays.  In addition, Guile allows applications
  95. to define their own data types, with the same status as the built-in
  96. standard Scheme types.
  97.  
  98.    As a Scheme program runs, values of all types pop in and out of
  99. existence.  Sometimes values are stored in variables, but more commonly
  100. they pass seamlessly from being the result of one computation to being
  101. one of the parameters for the next.
  102.  
  103.    Consider an example.  A string value is created because the
  104. interpreter reads in a literal string from your program's source code.
  105. Then a numeric value is created as the result of calculating the length
  106. of the string.  A second numeric value is created by doubling the
  107. calculated length.  Finally the program creates a list with two
  108. elements - the doubled length and the original string itself - and
  109. stores this list in a program variable.
  110.  
  111.    All of the values involved here - in fact, all values in Scheme -
  112. carry their type with them.  In other words, every value "knows," at
  113. runtime, what kind of value it is.  A number, a string, a list,
  114. whatever.
  115.  
  116.    A variable, on the other hand, has no fixed type.  A variable - `x',
  117. say - is simply the name of a location - a box - in which you can store
  118. any kind of Scheme value.  So the same variable in a program may hold a
  119. number at one moment, a list of procedures the next, and later a pair
  120. of strings.  The "type" of a variable - insofar as the idea is
  121. meaningful at all - is simply the type of whatever value the variable
  122. happens to be storing at a particular moment.
  123.  
  124. 
  125. File: guile.info,  Node: Definition,  Prev: Values and Variables,  Up: About Data
  126.  
  127. Defining and Setting Variables
  128. ------------------------------
  129.  
  130.    To define a new variable, you use Scheme's `define' syntax like this:
  131.  
  132.      (define VARIABLE-NAME VALUE)
  133.  
  134.    This makes a new variable called VARIABLE-NAME and stores VALUE in
  135. it as the variable's initial value.  For example:
  136.  
  137.      ;; Make a variable `x' with initial numeric value 1.
  138.      (define x 1)
  139.      
  140.      ;; Make a variable `organization' with an initial string value.
  141.      (define organization "Free Software Foundation")
  142.  
  143.    (In Scheme, a semicolon marks the beginning of a comment that
  144. continues until the end of the line.  So the lines beginning `;;' are
  145. comments.)
  146.  
  147.    Changing the value of an already existing variable is very similar,
  148. except that `define' is replaced by the Scheme syntax `set!', like this:
  149.  
  150.      (set! VARIABLE-NAME NEW-VALUE)
  151.  
  152.    Remember that variables do not have fixed types, so NEW-VALUE may
  153. have a completely different type from whatever was previously stored in
  154. the location named by VARIABLE-NAME.  Both of the following examples
  155. are therefore correct.
  156.  
  157.      ;; Change the value of `x' to 5.
  158.      (set! x 5)
  159.      
  160.      ;; Change the value of `organization' to the FSF's street number.
  161.      (set! organization 545)
  162.  
  163.    In these examples, VALUE and NEW-VALUE are literal numeric or string
  164. values.  In general, however, VALUE and NEW-VALUE can be any Scheme
  165. expression.  Even though we have not yet covered the forms that Scheme
  166. expressions can take (*note About Expressions::), you can probably
  167. guess what the following `set!' example does...
  168.  
  169.      (set! x (+ x 1))
  170.  
  171.    (Note: this is not a complete description of `define' and `set!',
  172. because we need to introduce some other aspects of Scheme before the
  173. missing pieces can be filled in.  If, however, you are already familiar
  174. with the structure of Scheme, you may like to read about those missing
  175. pieces immediately by jumping ahead to the following references.
  176.  
  177.    * *Note Internal Definitions::, to read about using `define' other
  178.      than at top level in a Scheme program, including a discussion of
  179.      when it works to use `define' rather than `set!' to change the
  180.      value of an existing variable.
  181.  
  182.    * *Note Lambda Alternatives::, to read about an alternative form of
  183.      the `define' syntax that can be used when defining new procedures.
  184.  
  185.    * *Note Procedures with Setters::, to read about an alternative form
  186.      of the `set!' syntax that helps with changing a single value in
  187.      the depths of a compound data structure.)
  188.  
  189. 
  190. File: guile.info,  Node: About Procedures,  Next: About Expressions,  Prev: About Data,  Up: Basic Ideas
  191.  
  192. The Representation and Use of Procedures
  193. ========================================
  194.  
  195.    This section introduces the basics of using and creating Scheme
  196. procedures.  It discusses the representation of procedures as just
  197. another kind of Scheme value, and shows how procedure invocation
  198. expressions are constructed.  We then explain how `lambda' is used to
  199. create new procedures, and conclude by presenting the various shorthand
  200. forms of `define' that can be used instead of writing an explicit
  201. `lambda' expression.
  202.  
  203. * Menu:
  204.  
  205. * Procedures as Values::        Procedures are values like everything else.
  206. * Simple Invocation::           How to write a simple procedure invocation.
  207. * Creating a Procedure::        How to create your own procedures.
  208. * Lambda Alternatives::         Other ways of writing procedure definitions.
  209.  
  210. 
  211. File: guile.info,  Node: Procedures as Values,  Next: Simple Invocation,  Up: About Procedures
  212.  
  213. Procedures as Values
  214. --------------------
  215.  
  216.    One of the great simplifications of Scheme is that a procedure is
  217. just another type of value, and that procedure values can be passed
  218. around and stored in variables in exactly the same way as, for example,
  219. strings and lists.  When we talk about a built-in standard Scheme
  220. procedure such as `open-input-file', what we actually mean is that
  221. there is a pre-defined top level variable called `open-input-file',
  222. whose value is a procedure that implements what R5RS says that
  223. `open-input-file' should do.
  224.  
  225.    Note that this is quite different from many dialects of Lisp --
  226. including Emacs Lisp -- in which a program can use the same name with
  227. two quite separate meanings: one meaning identifies a Lisp function,
  228. while the other meaning identifies a Lisp variable, whose value need
  229. have nothing to do with the function that is associated with the first
  230. meaning.  In these dialects, functions and variables are said to live in
  231. different "namespaces".
  232.  
  233.    In Scheme, on the other hand, all names belong to a single unified
  234. namespace, and the variables that these names identify can hold any kind
  235. of Scheme value, including procedure values.
  236.  
  237.    One consequence of the "procedures as values" idea is that, if you
  238. don't happen to like the standard name for a Scheme procedure, you can
  239. change it.
  240.  
  241.    For example, `call-with-current-continuation' is a very important
  242. standard Scheme procedure, but it also has a very long name!  So, many
  243. programmers use the following definition to assign the same procedure
  244. value to the more convenient name `call/cc'.
  245.  
  246.      (define call/cc call-with-current-continuation)
  247.  
  248.    Let's understand exactly how this works.  The definition creates a
  249. new variable `call/cc', and then sets its value to the value of the
  250. variable `call-with-current-continuation'; the latter value is a
  251. procedure that implements the behaviour that R5RS specifies under the
  252. name "call-with-current-continuation".  So `call/cc' ends up holding
  253. this value as well.
  254.  
  255.    Now that `call/cc' holds the required procedure value, you could
  256. choose to use `call-with-current-continuation' for a completely
  257. different purpose, or just change its value so that you will get an
  258. error if you accidentally use `call-with-current-continuation' as a
  259. procedure in your program rather than `call/cc'.  For example:
  260.  
  261.      (set! call-with-current-continuation "Not a procedure any more!")
  262.  
  263.    Or you could just leave `call-with-current-continuation' as it was.
  264. It's perfectly fine for more than one variable to hold the same
  265. procedure value.
  266.  
  267. 
  268. File: guile.info,  Node: Simple Invocation,  Next: Creating a Procedure,  Prev: Procedures as Values,  Up: About Procedures
  269.  
  270. Simple Procedure Invocation
  271. ---------------------------
  272.  
  273.    A procedure invocation in Scheme is written like this:
  274.  
  275.      (PROCEDURE [ARG1 [ARG2 ...]])
  276.  
  277.    In this expression, PROCEDURE can be any Scheme expression whose
  278. value is a procedure.  Most commonly, however, PROCEDURE is simply the
  279. name of a variable whose value is a procedure.
  280.  
  281.    For example, `string-append' is a standard Scheme procedure whose
  282. behaviour is to concatenate together all the arguments, which are
  283. expected to be strings, that it is given.  So the expression
  284.  
  285.      (string-append "/home" "/" "andrew")
  286.  
  287. is a procedure invocation whose result is the string value
  288. `"/home/andrew"'.
  289.  
  290.    Similarly, `string-length' is a standard Scheme procedure that
  291. returns the length of a single string argument, so
  292.  
  293.      (string-length "abc")
  294.  
  295. is a procedure invocation whose result is the numeric value 3.
  296.  
  297.    Each of the parameters in a procedure invocation can itself be any
  298. Scheme expression.  Since a procedure invocation is itself a type of
  299. expression, we can put these two examples together to get
  300.  
  301.      (string-length (string-append "/home" "/" "andrew"))
  302.  
  303. -- a procedure invocation whose result is the numeric value 12.
  304.  
  305.    (You may be wondering what happens if the two examples are combined
  306. the other way round.  If we do this, we can make a procedure invocation
  307. expression that is _syntactically_ correct:
  308.  
  309.      (string-append "/home" (string-length "abc"))
  310.  
  311. but when this expression is executed, it will cause an error, because
  312. the result of `(string-length "abc")' is a numeric value, and
  313. `string-append' is not designed to accept a numeric value as one of its
  314. arguments.)
  315.  
  316. 
  317. File: guile.info,  Node: Creating a Procedure,  Next: Lambda Alternatives,  Prev: Simple Invocation,  Up: About Procedures
  318.  
  319. Creating and Using a New Procedure
  320. ----------------------------------
  321.  
  322.    Scheme has lots of standard procedures, and Guile provides all of
  323. these via predefined top level variables.  All of these standard
  324. procedures are documented in the later chapters of this reference
  325. manual.
  326.  
  327.    Before very long, though, you will want to create new procedures that
  328. encapsulate aspects of your own applications' functionality.  To do
  329. this, you can use the famous `lambda' syntax.
  330.  
  331.    For example, the value of the following Scheme expression
  332.  
  333.      (lambda (name address) EXPRESSION ...)
  334.  
  335. is a newly created procedure that takes two arguments: `name' and
  336. `address'.  The behaviour of the new procedure is determined by the
  337. sequence of EXPRESSIONs in the "body" of the procedure definition.
  338. (Typically, these EXPRESSIONs would use the arguments in some way, or
  339. else there wouldn't be any point in giving them to the procedure.)
  340. When invoked, the new procedure returns a value that is the value of
  341. the last EXPRESSION in the procedure body.
  342.  
  343.    To make things more concrete, let's suppose that the two arguments
  344. are both strings, and that the purpose of this procedure is to form a
  345. combined string that includes these arguments.  Then the full lambda
  346. expression might look like this:
  347.  
  348.      (lambda (name address)
  349.        (string-append "Name=" name ":Address=" address))
  350.  
  351.    We noted in the previous subsection that the PROCEDURE part of a
  352. procedure invocation expression can be any Scheme expression whose value
  353. is a procedure.  But that's exactly what a lambda expression is!  So we
  354. can use a lambda expression directly in a procedure invocation, like
  355. this:
  356.  
  357.      ((lambda (name address)
  358.         (string-append "Name=" name ":Address=" address))
  359.       "FSF"
  360.       "Cambridge")
  361.  
  362. This is a valid procedure invocation expression, whose result is the
  363. string `"Name=FSF:Address=Cambridge"'.
  364.  
  365.    It it more common, though, to store the procedure value in a
  366. variable --
  367.  
  368.      (define make-combined-string
  369.        (lambda (name address)
  370.          (string-append "Name=" name ":Address=" address)))
  371.  
  372. -- and then to use the variable name in the procedure invocation:
  373.  
  374.      (make-combined-string "FSF" "Cambridge")
  375.  
  376. Which has exactly the same result.
  377.  
  378.    It's important to note that procedures created using `lambda' have
  379. exactly the same status as the standard built in Scheme procedures, and
  380. can be invoked, passed around, and stored in variables in exactly the
  381. same ways.
  382.  
  383. 
  384. File: guile.info,  Node: Lambda Alternatives,  Prev: Creating a Procedure,  Up: About Procedures
  385.  
  386. Lambda Alternatives
  387. -------------------
  388.  
  389.    Since it is so common in Scheme programs to want to create a
  390. procedure and then store it in a variable, there is an alternative form
  391. of the `define' syntax that allows you to do just that.
  392.  
  393.    A `define' expression of the form
  394.  
  395.      (define (NAME [ARG1 [ARG2 ...]])
  396.        EXPRESSION ...)
  397.  
  398. is exactly equivalent to the longer form
  399.  
  400.      (define NAME
  401.        (lambda ([ARG1 [ARG2 ...]])
  402.          EXPRESSION ...))
  403.  
  404.    So, for example, the definition of `make-combined-string' in the
  405. previous subsection could equally be written:
  406.  
  407.      (define (make-combined-string name address)
  408.        (string-append "Name=" name ":Address=" address))
  409.  
  410.    This kind of procedure definition creates a procedure that requires
  411. exactly the expected number of arguments.  There are two further forms
  412. of the `lambda' expression, which create a procedure that can accept a
  413. variable number of arguments:
  414.  
  415.      (lambda (ARG1 ... . ARGS) EXPRESSION ...)
  416.      
  417.      (lambda ARGS EXPRESSION ...)
  418.  
  419. The corresponding forms of the alternative `define' syntax are:
  420.  
  421.      (define (NAME ARG1 ... . ARGS) EXPRESSION ...)
  422.      
  423.      (define (NAME . ARGS) EXPRESSION ...)
  424.  
  425. For details on how these forms work, see *Note Lambda::.
  426.  
  427.    (It could be argued that the alternative `define' forms are rather
  428. confusing, especially for newcomers to the Scheme language, as they hide
  429. both the role of `lambda' and the fact that procedures are values that
  430. are stored in variables in the some way as any other kind of value.  On
  431. the other hand, they are very convenient, and they are also a good
  432. example of another of Scheme's powerful features: the ability to specify
  433. arbitrary syntactic transformations at run time, which can be applied to
  434. subsequently read input.)
  435.  
  436. 
  437. File: guile.info,  Node: About Expressions,  Next: About Closure,  Prev: About Procedures,  Up: Basic Ideas
  438.  
  439. Expressions and Evaluation
  440. ==========================
  441.  
  442.    So far, we have met expressions that _do_ things, such as the
  443. `define' expressions that create and initialize new variables, and we
  444. have also talked about expressions that have _values_, for example the
  445. value of the procedure invocation expression:
  446.  
  447.      (string-append "/home" "/" "andrew")
  448.  
  449. but we haven't yet been precise about what causes an expression like
  450. this procedure invocation to be reduced to its "value", or how the
  451. processing of such expressions relates to the execution of a Scheme
  452. program as a whole.
  453.  
  454.    This section clarifies what we mean by an expression's value, by
  455. introducing the idea of "evaluation".  It discusses the side effects
  456. that evaluation can have, explains how each of the various types of
  457. Scheme expression is evaluated, and describes the behaviour and use of
  458. the Guile REPL as a mechanism for exploring evaluation.  The section
  459. concludes with a very brief summary of Scheme's common syntactic
  460. expressions.
  461.  
  462. * Menu:
  463.  
  464. * Evaluating::                  How a Scheme program is executed.
  465. * The REPL::                    Interacting with the Guile interpreter.
  466. * Syntax Summary::              Common syntactic expressions -- in brief.
  467.  
  468. 
  469. File: guile.info,  Node: Evaluating,  Next: The REPL,  Up: About Expressions
  470.  
  471. Evaluating Expressions and Executing Programs
  472. ---------------------------------------------
  473.  
  474.    In Scheme, the process of executing an expression is known as
  475. "evaluation".  Evaluation has two kinds of result:
  476.  
  477.    * the "value" of the evaluated expression
  478.  
  479.    * the "side effects" of the evaluation, which consist of any effects
  480.      of evaluating the expression that are not represented by the value.
  481.  
  482.    Of the expressions that we have met so far, `define' and `set!'
  483. expressions have side effects -- the creation or modification of a
  484. variable -- but no value; `lambda' expressions have values -- the newly
  485. constructed procedures -- but no side effects; and procedure invocation
  486. expressions, in general, have either values, or side effects, or both.
  487.  
  488.    It is tempting to try to define more intuitively what we mean by
  489. "value" and "side effects", and what the difference between them is.
  490. In general, though, this is extremely difficult.  It is also
  491. unnecessary; instead, we can quite happily define the behaviour of a
  492. Scheme program by specifying how Scheme executes a program as a whole,
  493. and then by describing the value and side effects of evaluation for each
  494. type of expression individually.
  495.  
  496. So, some(1) definitions...
  497.  
  498.    * A Scheme program consists of a sequence of expressions.
  499.  
  500.    * A Scheme interpreter executes the program by evaluating these
  501.      expressions in order, one by one.
  502.  
  503.    * An expression can be
  504.  
  505.         * a piece of literal data, such as a number `2.3' or a string
  506.           `"Hello world!"'
  507.  
  508.         * a variable name
  509.  
  510.         * a procedure invocation expression
  511.  
  512.         * one of Scheme's special syntactic expressions.
  513.  
  514. The following subsections describe how each of these types of expression
  515. is evaluated.
  516.  
  517. * Menu:
  518.  
  519. * Eval Literal::                Evaluating literal data.
  520. * Eval Variable::               Evaluating variable references.
  521. * Eval Procedure::              Evaluating procedure invocation expressions.
  522. * Eval Special::                Evaluating special syntactic expressions.
  523.  
  524.    ---------- Footnotes ----------
  525.  
  526.    (1) These definitions are approximate.  For the whole and detailed
  527. truth, see *Note R5RS syntax: (r5rs)Formal syntax and semantics.
  528.  
  529. 
  530. File: guile.info,  Node: Eval Literal,  Next: Eval Variable,  Up: Evaluating
  531.  
  532. Evaluating Literal Data
  533. .......................
  534.  
  535.    When a literal data expression is evaluated, the value of the
  536. expression is simply the value that the expression describes.  The
  537. evaluation of a literal data expression has no side effects.
  538.  
  539. So, for example,
  540.  
  541.    * the value of the expression `"abc"' is the string value `"abc"'
  542.  
  543.    * the value of the expression `3+4i' is the complex number 3 + 4i
  544.  
  545.    * the value of the expression `#(1 2 3)' is a three-element vector
  546.      containing the numeric values 1, 2 and 3.
  547.  
  548.    For any data type which can be expressed literally like this, the
  549. syntax of the literal data expression for that data type -- in other
  550. words, what you need to write in your code to indicate a literal value
  551. of that type -- is known as the data type's "read syntax".  This manual
  552. specifies the read syntax for each such data type in the section that
  553. describes that data type.
  554.  
  555.    Some data types do not have a read syntax.  Procedures, for example,
  556. cannot be expressed as literal data; they must be created using a
  557. `lambda' expression (*note Creating a Procedure::) or implicitly using
  558. the shorthand form of `define' (*note Lambda Alternatives::).
  559.  
  560. 
  561. File: guile.info,  Node: Eval Variable,  Next: Eval Procedure,  Prev: Eval Literal,  Up: Evaluating
  562.  
  563. Evaluating a Variable Reference
  564. ...............................
  565.  
  566.    When an expression that consists simply of a variable name is
  567. evaluated, the value of the expression is the value of the named
  568. variable.  The evaluation of a variable reference expression has no
  569. side effects.
  570.  
  571.    So, after
  572.  
  573.      (define key "Paul Evans")
  574.  
  575. the value of the expression `key' is the string value `"Paul Evans"'.
  576. If KEY is then modified by
  577.  
  578.      (set! key 3.74)
  579.  
  580. the value of the expression `key' is the numeric value 3.74.
  581.  
  582.    If there is no variable with the specified name, evaluation of the
  583. variable reference expression signals an error.
  584.  
  585. 
  586. File: guile.info,  Node: Eval Procedure,  Next: Eval Special,  Prev: Eval Variable,  Up: Evaluating
  587.  
  588. Evaluating a Procedure Invocation Expression
  589. ............................................
  590.  
  591.    This is where evaluation starts getting interesting!  As already
  592. noted, a procedure invocation expression has the form
  593.  
  594.      (PROCEDURE [ARG1 [ARG2 ...]])
  595.  
  596. where PROCEDURE must be an expression whose value, when evaluated, is a
  597. procedure.
  598.  
  599.    The evaluation of a procedure invocation expression like this
  600. proceeds by
  601.  
  602.    * evaluating individually the expressions PROCEDURE, ARG1, ARG2, and
  603.      so on
  604.  
  605.    * calling the procedure that is the value of the PROCEDURE
  606.      expression with the list of values obtained from the evaluations of
  607.      ARG1, ARG2 etc. as its parameters.
  608.  
  609.    For a procedure defined in Scheme, "calling the procedure with the
  610. list of values as its parameters" means binding the values to the
  611. procedure's formal parameters and then evaluating the sequence of
  612. expressions that make up the body of the procedure definition.  The
  613. value of the procedure invocation expression is the value of the last
  614. evaluated expression in the procedure body.  The side effects of calling
  615. the procedure are the combination of the side effects of the sequence of
  616. evaluations of expressions in the procedure body.
  617.  
  618.    For a built-in procedure, the value and side-effects of calling the
  619. procedure are best described by that procedure's documentation.
  620.  
  621.    Note that the complete side effects of evaluating a procedure
  622. invocation expression consist not only of the side effects of the
  623. procedure call, but also of any side effects of the preceding
  624. evaluation of the expressions PROCEDURE, ARG1, ARG2, and so on.
  625.  
  626.    To illustrate this, let's look again at the procedure invocation
  627. expression:
  628.  
  629.      (string-length (string-append "/home" "/" "andrew"))
  630.  
  631.    In the outermost expression, PROCEDURE is `string-length' and ARG1
  632. is `(string-append "/home" "/" "andrew")'.
  633.  
  634.    * Evaluation of `string-length', which is a variable, gives a
  635.      procedure value that implements the expected behaviour for
  636.      "string-length".
  637.  
  638.    * Evaluation of `(string-append "/home" "/" "andrew")', which is
  639.      another procedure invocation expression, means evaluating each of
  640.  
  641.         * `string-append', which gives a procedure value that
  642.           implements the expected behaviour for "string-append"
  643.  
  644.         * `"/home"', which gives the string value `"/home"'
  645.  
  646.         * `"/"', which gives the string value `"/"'
  647.  
  648.         * `"andrew"', which gives the string value `"andrew"'
  649.  
  650.      and then invoking the procedure value with this list of string
  651.      values as its arguments.  The resulting value is a single string
  652.      value that is the concatenation of all the arguments, namely
  653.      `"/home/andrew"'.
  654.  
  655.    In the evaluation of the outermost expression, the interpreter can
  656. now invoke the procedure value obtained from PROCEDURE with the value
  657. obtained from ARG1 as its arguments.  The resulting value is a numeric
  658. value that is the length of the argument string, which is 12.
  659.  
  660. 
  661. File: guile.info,  Node: Eval Special,  Prev: Eval Procedure,  Up: Evaluating
  662.  
  663. Evaluating Special Syntactic Expressions
  664. ........................................
  665.  
  666.    When a procedure invocation expression is evaluated, the procedure
  667. and _all_ the argument expressions must be evaluated before the
  668. procedure can be invoked.  Special syntactic expressions are special
  669. because they are able to manipulate their arguments in an unevaluated
  670. form, and can choose whether to evaluate any or all of the argument
  671. expressions.
  672.  
  673.    Why is this needed?  Consider a program fragment that asks the user
  674. whether or not to delete a file, and then deletes the file if the user
  675. answers yes.
  676.  
  677.      (if (string=? (read-answer "Should I delete this file?")
  678.                    "yes")
  679.          (delete-file file))
  680.  
  681.    If the outermost `(if ...)' expression here was a procedure
  682. invocation expression, the expression `(delete-file file)', whose
  683. effect is to actually delete a file, would already have been executed
  684. before the `if' procedure even got invoked!  Clearly this is no use --
  685. the whole point of an `if' expression is that the "consequent"
  686. expression is only evaluated if the condition of the `if' expression is
  687. "true".
  688.  
  689.    Therefore `if' must be special syntax, not a procedure.  Other
  690. special syntaxes that we have already met are `define', `set!' and
  691. `lambda'.  `define' and `set!' are syntax because they need to know the
  692. variable _name_ that is given as the first argument in a `define' or
  693. `set!' expression, not that variable's value.  `lambda' is syntax
  694. because it does not immediately evaluate the expressions that define
  695. the procedure body; instead it creates a procedure object that
  696. incorporates these expressions so that they can be evaluated in the
  697. future, when that procedure is invoked.
  698.  
  699.    The rules for evaluating each special syntactic expression are
  700. specified individually for each special syntax.  For a summary of
  701. standard special syntax, see *Note Syntax Summary::.
  702.  
  703. 
  704. File: guile.info,  Node: The REPL,  Next: Syntax Summary,  Prev: Evaluating,  Up: About Expressions
  705.  
  706. Using the Guile REPL
  707. --------------------
  708.  
  709.    If you start Guile without specifying a particular program for it to
  710. execute, Guile enters its standard Read Evaluate Print Loop -- or
  711. "REPL" for short.  In this mode, Guile repeatedly reads in the next
  712. Scheme expression that the user types, evaluates it, and prints the
  713. resulting value.
  714.  
  715.    The REPL is a useful mechanism for exploring the evaluation behaviour
  716. described in the previous subsection.  If you type `string-append', for
  717. example, the REPL replies `#<primitive-procedure string-append>',
  718. illustrating the relationship between the variable `string-append' and
  719. the procedure value stored in that variable.
  720.  
  721.    In this manual, the notation => is used to mean "evaluates to".
  722. Wherever you see an example of the form
  723.  
  724.      EXPRESSION
  725.      =>
  726.      RESULT
  727.  
  728. feel free to try it out yourself by typing EXPRESSION into the REPL and
  729. checking that it gives the expected RESULT.
  730.  
  731. 
  732. File: guile.info,  Node: Syntax Summary,  Prev: The REPL,  Up: About Expressions
  733.  
  734. Summary of Common Syntax
  735. ------------------------
  736.  
  737.    This subsection lists the most commonly used Scheme syntactic
  738. expressions, simply so that you will recognize common special syntax
  739. when you see it.  For a full description of each of these syntaxes,
  740. follow the appropriate reference.
  741.  
  742.    `if' and `cond' (*note if cond case::) provide conditional
  743. evaluation of argument expressions depending on whether one or more
  744. conditions evaluate to "true" or "false".
  745.  
  746.    `case' (*note if cond case::) provides conditional evaluation of
  747. argument expressions depending on whether a variable has one of a
  748. specified group of values.
  749.  
  750.    `define' (REFFIXME) is used to create a new variable and set its
  751. initial value.
  752.  
  753.    `set!' (REFFIXME) is used to modify an existing variable's value.
  754.  
  755.    `lambda' (*note Lambda::) is used to construct procedure objects.
  756.  
  757.    `let', `let*' and `letrec' (*note Local Bindings::) create an inner
  758. lexical environment for the evaluation of a sequence of expressions, in
  759. which a specified set of local variables is bound to the values of a
  760. corresponding set of expressions.  For an introduction to environments,
  761. see *Note About Closure::.
  762.  
  763.    `begin' (*note begin::) executes a sequence of expressions in order
  764. and returns the value of the last expression.  Note that this is not the
  765. same as a procedure which returns its last argument, because the
  766. evaluation of a procedure invocation expression does not guarantee to
  767. evaluate the arguments in order.
  768.  
  769.    `and' (*note and or::) executes a sequence of expressions in order
  770. until either there are no expressions left, or one of them evaluates to
  771. "false".
  772.  
  773.    `or' (*note and or::) executes a sequence of expressions in order
  774. until either there are no expressions left, or one of them evaluates to
  775. "true".
  776.  
  777. 
  778. File: guile.info,  Node: About Closure,  Prev: About Expressions,  Up: Basic Ideas
  779.  
  780. The Concept of Closure
  781. ======================
  782.  
  783.    The concept of "closure" is the idea that a lambda expression
  784. "captures" the variable bindings that are in lexical scope at the point
  785. where the lambda expression occurs.  The procedure created by the
  786. lambda expression can refer to and mutate the captured bindings, and the
  787. values of those bindings persist between procedure calls.
  788.  
  789.    This section explains and explores the various parts of this idea in
  790. more detail.
  791.  
  792. * Menu:
  793.  
  794. * About Environments::          Names, locations, values and environments.
  795. * Local Variables::             Local variables and local environments.
  796. * Chaining::                    Environment chaining.
  797. * Lexical Scope::               The meaning of lexical scoping.
  798. * Closure::                     Explaining the concept of closure.
  799. * Serial Number::               Example 1: a serial number generator.
  800. * Shared Variable::             Example 2: a shared persistent variable.
  801. * Callback Closure::            Example 3: the callback closure problem.
  802. * OO Closure::                  Example 4: object orientation.
  803.  
  804. 
  805. File: guile.info,  Node: About Environments,  Next: Local Variables,  Up: About Closure
  806.  
  807. Names, Locations, Values and Environments
  808. -----------------------------------------
  809.  
  810.    We said earlier that a variable name in a Scheme program is
  811. associated with a location in which any kind of Scheme value may be
  812. stored.  (Incidentally, the term "vcell" is often used in Lisp and
  813. Scheme circles as an alternative to "location".)  Thus part of what we
  814. mean when we talk about "creating a variable" is in fact establishing an
  815. association between a name, or identifier, that is used by the Scheme
  816. program code, and the variable location to which that name refers.
  817. Although the value that is stored in that location may change, the
  818. location to which a given name refers is always the same.
  819.  
  820.    We can illustrate this by breaking down the operation of the
  821. `define' syntax into three parts: `define'
  822.  
  823.    * creates a new location
  824.  
  825.    * establishes an association between that location and the name
  826.      specified as the first argument of the `define' expression
  827.  
  828.    * stores in that location the value obtained by evaluating the second
  829.      argument of the `define' expression.
  830.  
  831.    A collection of associations between names and locations is called an
  832. "environment".  When you create a top level variable in a program using
  833. `define', the name-location association for that variable is added to
  834. the "top level" environment.  The "top level" environment also includes
  835. name-location associations for all the procedures that are supplied by
  836. standard Scheme.
  837.  
  838.    It is also possible to create environments other than the top level
  839. one, and to create variable bindings, or name-location associations, in
  840. those environments.  This ability is a key ingredient in the concept of
  841. closure; the next subsection shows how it is done.
  842.  
  843. 
  844. File: guile.info,  Node: Local Variables,  Next: Chaining,  Prev: About Environments,  Up: About Closure
  845.  
  846. Local Variables and Environments
  847. --------------------------------
  848.  
  849.    We have seen how to create top level variables using the `define'
  850. syntax (*note Definition::).  It is often useful to create variables
  851. that are more limited in their scope, typically as part of a procedure
  852. body.  In Scheme, this is done using the `let' syntax, or one of its
  853. modified forms `let*' and `letrec'.  These syntaxes are described in
  854. full later in the manual (*note Local Bindings::).  Here our purpose is
  855. to illustrate their use just enough that we can see how local variables
  856. work.
  857.  
  858.    For example, the following code uses a local variable `s' to
  859. simplify the computation of the area of a triangle given the lengths of
  860. its three sides.
  861.  
  862.      (define a 5.3)
  863.      (define b 4.7)
  864.      (define c 2.8)
  865.      
  866.      (define area
  867.        (let ((s (/ (+ a b c) 2)))
  868.          (sqrt (* s (- s a) (- s b) (- s c)))))
  869.  
  870.    The effect of the `let' expression is to create a new environment
  871. and, within this environment, an association between the name `s' and a
  872. new location whose initial value is obtained by evaluating `(/ (+ a b
  873. c) 2)'.  The expressions in the body of the `let', namely `(sqrt (* s
  874. (- s a) (- s b) (- s c)))', are then evaluated in the context of the
  875. new environment, and the value of the last expression evaluated becomes
  876. the value of the whole `let' expression, and therefore the value of the
  877. variable `area'.
  878.  
  879. 
  880. File: guile.info,  Node: Chaining,  Next: Lexical Scope,  Prev: Local Variables,  Up: About Closure
  881.  
  882. Environment Chaining
  883. --------------------
  884.  
  885.    In the example of the previous subsection, we glossed over an
  886. important point.  The body of the `let' expression in that example
  887. refers not only to the local variable `s', but also to the top level
  888. variables `a', `b', `c' and `sqrt'.  (`sqrt' is the standard Scheme
  889. procedure for calculating a square root.)  If the body of the `let'
  890. expression is evaluated in the context of the _local_ `let'
  891. environment, how does the evaluation get at the values of these top
  892. level variables?
  893.  
  894.    The answer is that the local environment created by a `let'
  895. expression automatically has a reference to its containing environment
  896. -- in this case the top level environment -- and that the Scheme
  897. interpreter automatically looks for a variable binding in the containing
  898. environment if it doesn't find one in the local environment.  More
  899. generally, every environment except for the top level one has a
  900. reference to its containing environment, and the interpreter keeps
  901. searching back up the chain of environments -- from most local to top
  902. level -- until it either finds a variable binding for the required
  903. identifier or exhausts the chain.
  904.  
  905.    This description also determines what happens when there is more than
  906. one variable binding with the same name.  Suppose, continuing the
  907. example of the previous subsection, that there was also a pre-existing
  908. top level variable `s' created by the expression:
  909.  
  910.      (define s "Some beans, my lord!")
  911.  
  912.    Then both the top level environment and the local `let' environment
  913. would contain bindings for the name `s'.  When evaluating code within
  914. the `let' body, the interpreter looks first in the local `let'
  915. environment, and so finds the binding for `s' created by the `let'
  916. syntax.  Even though this environment has a reference to the top level
  917. environment, which also has a binding for `s', the interpreter doesn't
  918. get as far as looking there.  When evaluating code outside the `let'
  919. body, the interpreter looks up variable names in the top level
  920. environment, so the name `s' refers to the top level variable.
  921.  
  922.    Within the `let' body, the binding for `s' in the local environment
  923. is said to "shadow" the binding for `s' in the top level environment.
  924.  
  925. 
  926. File: guile.info,  Node: Lexical Scope,  Next: Closure,  Prev: Chaining,  Up: About Closure
  927.  
  928. Lexical Scope
  929. -------------
  930.  
  931.    The rules that we have just been describing are the details of how
  932. Scheme implements "lexical scoping".  This subsection takes a brief
  933. diversion to explain what lexical scope means in general and to present
  934. an example of non-lexical scoping.
  935.  
  936.    "Lexical scope" in general is the idea that
  937.  
  938.    * an identifier at a particular place in a program always refers to
  939.      the same variable location -- where "always" means "every time
  940.      that the containing expression is executed", and that
  941.  
  942.    * the variable location to which it refers can be determined by
  943.      static examination of the source code context in which that
  944.      identifier appears, without having to consider the flow of
  945.      execution through the program as a whole.
  946.  
  947.    In practice, lexical scoping is the norm for most programming
  948. languages, and probably corresponds to what you would intuitively
  949. consider to be "normal".  You may even be wondering how the situation
  950. could possibly -- and usefully -- be otherwise.  To demonstrate that
  951. another kind of scoping is possible, therefore, and to compare it
  952. against lexical scoping, the following subsection presents an example
  953. of non-lexical scoping and examines in detail how its behavior differs
  954. from the corresponding lexically scoped code.
  955.  
  956. * Menu:
  957.  
  958. * Scoping Example::             An example of non-lexical scoping.
  959.  
  960. 
  961. File: guile.info,  Node: Scoping Example,  Up: Lexical Scope
  962.  
  963. An Example of Non-Lexical Scoping
  964. .................................
  965.  
  966.    To demonstrate that non-lexical scoping does exist and can be
  967. useful, we present the following example from Emacs Lisp, which is a
  968. "dynamically scoped" language.
  969.  
  970.      (defvar currency-abbreviation "USD")
  971.      
  972.      (defun currency-string (units hundredths)
  973.        (concat currency-abbreviation
  974.                (number-to-string units)
  975.                "."
  976.                (number-to-string hundredths)))
  977.      
  978.      (defun french-currency-string (units hundredths)
  979.        (let ((currency-abbreviation "FRF"))
  980.          (currency-string units hundredths)))
  981.  
  982.    The question to focus on here is: what does the identifier
  983. `currency-abbreviation' refer to in the `currency-string' function?
  984. The answer, in Emacs Lisp, is that all variable bindings go onto a
  985. single stack, and that `currency-abbreviation' refers to the topmost
  986. binding from that stack which has the name "currency-abbreviation".
  987. The binding that is created by the `defvar' form, to the value `"USD"',
  988. is only relevant if none of the code that calls `currency-string'
  989. rebinds the name "currency-abbreviation" in the meanwhile.
  990.  
  991.    The second function `french-currency-string' works precisely by
  992. taking advantage of this behaviour.  It creates a new binding for the
  993. name "currency-abbreviation" which overrides the one established by the
  994. `defvar' form.
  995.  
  996.      ;; Note!  This is Emacs Lisp evaluation, not Scheme!
  997.      (french-currency-string 33 44)
  998.      =>
  999.      "FRF33.44"
  1000.  
  1001.    Now let's look at the corresponding, _lexically scoped_ Scheme code:
  1002.  
  1003.      (define currency-abbreviation "USD")
  1004.      
  1005.      (define (currency-string units hundredths)
  1006.        (string-append currency-abbreviation
  1007.                       (number->string units)
  1008.                       "."
  1009.                       (number->string hundredths)))
  1010.      
  1011.      (define (french-currency-string units hundredths)
  1012.        (let ((currency-abbreviation "FRF"))
  1013.          (currency-string units hundredths)))
  1014.  
  1015.    According to the rules of lexical scoping, the
  1016. `currency-abbreviation' in `currency-string' refers to the variable
  1017. location in the innermost environment at that point in the code which
  1018. has a binding for `currency-abbreviation', which is the variable
  1019. location in the top level environment created by the preceding `(define
  1020. currency-abbreviation ...)' expression.
  1021.  
  1022.    In Scheme, therefore, the `french-currency-string' procedure does
  1023. not work as intended.  The variable binding that it creates for
  1024. "currency-abbreviation" is purely local to the code that forms the body
  1025. of the `let' expression.  Since this code doesn't directly use the name
  1026. "currency-abbreviation" at all, the binding is pointless.
  1027.  
  1028.      (french-currency-string 33 44)
  1029.      =>
  1030.      "USD33.44"
  1031.  
  1032.    This begs the question of how the Emacs Lisp behaviour can be
  1033. implemented in Scheme.  In general, this is a design question whose
  1034. answer depends upon the problem that is being addressed.  In this case,
  1035. the best answer may be that `currency-string' should be redesigned so
  1036. that it can take an optional third argument.  This third argument, if
  1037. supplied, is interpreted as a currency abbreviation that overrides the
  1038. default.
  1039.  
  1040.    It is possible to change `french-currency-string' so that it mostly
  1041. works without changing `currency-string', but the fix is inelegant, and
  1042. susceptible to interrupts that could leave the `currency-abbreviation'
  1043. variable in the wrong state:
  1044.  
  1045.      (define (french-currency-string units hundredths)
  1046.        (set! currency-abbreviation "FRF")
  1047.        (let ((result (currency-string units hundredths)))
  1048.          (set! currency-abbreviation "USD")
  1049.          result))
  1050.  
  1051.    The key point here is that the code does not create any local binding
  1052. for the identifier `currency-abbreviation', so all occurrences of this
  1053. identifier refer to the top level variable.
  1054.  
  1055. 
  1056. File: guile.info,  Node: Closure,  Next: Serial Number,  Prev: Lexical Scope,  Up: About Closure
  1057.  
  1058. Closure
  1059. -------
  1060.  
  1061.    Consider a `let' expression that doesn't contain any `lambda's:
  1062.  
  1063.      (let ((s (/ (+ a b c) 2)))
  1064.        (sqrt (* s (- s a) (- s b) (- s c))))
  1065.  
  1066. When the Scheme interpreter evaluates this, it
  1067.  
  1068.    * creates a new environment with a reference to the environment that
  1069.      was current when it encountered the `let'
  1070.  
  1071.    * creates a variable binding for `s' in the new environment, with
  1072.      value given by `(/ (+ a b c) 2)'
  1073.  
  1074.    * evaluates the expression in the body of the `let' in the context of
  1075.      the new local environment, and remembers the value `V'
  1076.  
  1077.    * forgets the local environment
  1078.  
  1079.    * continues evaluating the expression that contained the `let', using
  1080.      the value `V' as the value of the `let' expression, in the context
  1081.      of the containing environment.
  1082.  
  1083.    After the `let' expression has been evaluated, the local environment
  1084. that was created is simply forgotten, and there is no longer any way to
  1085. access the binding that was created in this environment.  If the same
  1086. code is evaluated again, it will follow the same steps again, creating
  1087. a second new local environment that has no connection with the first,
  1088. and then forgetting this one as well.
  1089.  
  1090.    If the `let' body contains a `lambda' expression, however, the local
  1091. environment is _not_ forgotten.  Instead, it becomes associated with
  1092. the procedure that is created by the `lambda' expression, and is
  1093. reinstated every time that that procedure is called.  In detail, this
  1094. works as follows.
  1095.  
  1096.    * When the Scheme interpreter evaluates a `lambda' expression, to
  1097.      create a procedure object, it stores the current environment as
  1098.      part of the procedure definition.
  1099.  
  1100.    * Then, whenever that procedure is called, the interpreter
  1101.      reinstates the environment that is stored in the procedure
  1102.      definition and evaluates the procedure body within the context of
  1103.      that environment.
  1104.  
  1105.    The result is that the procedure body is always evaluated in the
  1106. context of the environment that was current when the procedure was
  1107. created.
  1108.  
  1109.    This is what is meant by "closure".  The next few subsections
  1110. present examples that explore the usefulness of this concept.
  1111.  
  1112. 
  1113. File: guile.info,  Node: Serial Number,  Next: Shared Variable,  Prev: Closure,  Up: About Closure
  1114.  
  1115. Example 1: A Serial Number Generator
  1116. ------------------------------------
  1117.  
  1118.    This example uses closure to create a procedure with a variable
  1119. binding that is private to the procedure, like a local variable, but
  1120. whose value persists between procedure calls.
  1121.  
  1122.      (define (make-serial-number-generator)
  1123.        (let ((current-serial-number 0))
  1124.          (lambda ()
  1125.            (set! current-serial-number (+ current-serial-number 1))
  1126.            current-serial-number)))
  1127.      
  1128.      (define entry-sn-generator (make-serial-number-generator))
  1129.      
  1130.      (entry-sn-generator)
  1131.      =>
  1132.      1
  1133.      
  1134.      (entry-sn-generator)
  1135.      =>
  1136.      2
  1137.  
  1138.    When `make-serial-number-generator' is called, it creates a local
  1139. environment with a binding for `current-serial-number' whose initial
  1140. value is 0, then, within this environment, creates a procedure.  The
  1141. local environment is stored within the created procedure object and so
  1142. persists for the lifetime of the created procedure.
  1143.  
  1144.    Every time the created procedure is invoked, it increments the value
  1145. of the `current-serial-number' binding in the captured environment and
  1146. then returns the current value.
  1147.  
  1148.    Note that `make-serial-number-generator' can be called again to
  1149. create a second serial number generator that is independent of the
  1150. first.  Every new invocation of `make-serial-number-generator' creates
  1151. a new local `let' environment and returns a new procedure object with
  1152. an association to this environment.
  1153.  
  1154. 
  1155. File: guile.info,  Node: Shared Variable,  Next: Callback Closure,  Prev: Serial Number,  Up: About Closure
  1156.  
  1157. Example 2: A Shared Persistent Variable
  1158. ---------------------------------------
  1159.  
  1160.    This example uses closure to create two procedures, `get-balance'
  1161. and `deposit', that both refer to the same captured local environment
  1162. so that they can both access the `balance' variable binding inside that
  1163. environment.  The value of this variable binding persists between calls
  1164. to either procedure.
  1165.  
  1166.    Note that the captured `balance' variable binding is private to
  1167. these two procedures: it is not directly accessible to any other code.
  1168. It can only be accessed indirectly via `get-balance' or `deposit', as
  1169. illustrated by the `withdraw' procedure.
  1170.  
  1171.      (define get-balance #f)
  1172.      (define deposit #f)
  1173.      
  1174.      (let ((balance 0))
  1175.        (set! get-balance
  1176.              (lambda ()
  1177.                balance))
  1178.        (set! deposit
  1179.              (lambda (amount)
  1180.                (set! balance (+ balance amount))
  1181.                balance)))
  1182.      
  1183.      (define (withdraw amount)
  1184.        (deposit (- amount)))
  1185.      
  1186.      (get-balance)
  1187.      =>
  1188.      0
  1189.      
  1190.      (deposit 50)
  1191.      =>
  1192.      50
  1193.      
  1194.      (withdraw 75)
  1195.      =>
  1196.      -25
  1197.  
  1198.    A detail here is that the `get-balance' and `deposit' variables must
  1199. be set up by `define'ing them at top level and then `set!'ing their
  1200. values inside the `let' body.  Using `define' within the `let' body
  1201. would not work: this would create variable bindings within the local
  1202. `let' environment that would not be accessible at top level.
  1203.  
  1204.